# conding = utf-8

# 就是与config.yml文件对应，yml里面有什么数据，
# 那么这个类就存在什么数据
import os

import yaml
from selenium import webdriver
from selenium.webdriver.edge.service import Service

from base.logback import Logger


class Config:
    '''
    配置对象
    '''
    config = None

    class Server:
        '''
        config文件中的server配置对象
        '''

        def __init__(self, name, version, description):
            self.name = name
            self.version = version
            self.description = description

    class SeleniumConfig:
        '''
        config文件中的selenium配置对象
        '''

        def __init__(self, url, browse, driver, wait):
            self.url = url
            self.browse = browse
            self.driver = driver
            self.wait = wait

    def __init__(self, server, selenium_config):
        self.server = Config.Server(
            server["name"],
            server["version"],
            server["description"]
        )
        self.selenium = Config.SeleniumConfig(
            selenium_config["url"],
            selenium_config["browse"],
            selenium_config["driver"],
            selenium_config["wait"]
        )

    @classmethod
    def load_config(cls):
        '''
        加载config.yml配置文件，
        加载完成后会将文件中的内容分别赋值Server对象和Selenium对象
        次文件使用的单例模式，只会加载一次
        :return:
        '''
        #读取路径
        path = os.path.dirname(__file__)+"\\config.yml"
        if cls.config is None:
            with open(path, "r", encoding="utf-8") as file:
                content = yaml.safe_load(file)
                cls.config = Config(content["server"], content["selenium"])
        return cls.config


class Driver:
    '''
    封装selenium驱动对象，用于处理UI自动化的
    '''
    __driver = None

    @classmethod
    def instance(cls):
        '''
        单例初始驱动对象
        :return:
        '''
        if cls.__driver is None:
            Logger.instance().info("正在加载浏览器驱动对象......")
            #获取配置文件中的浏览器类型
            browse = Config.load_config().selenium.browse
            #获取隐式等待时间
            wait = Config.load_config().selenium.wait
            #获取浏览器测试的UI地址
            url = Config.load_config().selenium.url
            if browse == "edge":
                cls.__driver = webdriver.Edge()
            elif browse == "chrome":
                cls.__driver = webdriver.Chrome()
            elif browse == "ff":
                cls.__driver = webdriver.Firefox()
            else:
                raise RuntimeError("浏览器类型不支持")
            Logger.instance().debug(f"使用{browse}浏览器......")
            #浏览器的通用设置（最大化打开，设置等待，设置地址）
            cls.__driver.maximize_window()
            Logger.instance().debug(f"隐式等待时间为{wait}秒")
            cls.__driver.implicitly_wait(wait)
            Logger.instance().debug(f"自动化测试地址为{url}")
            cls.__driver.get(url)
            Logger.instance().debug(f"浏览器驱动加载完成......")
        return cls.__driver;
